home *** CD-ROM | disk | FTP | other *** search
- *cX TECNICAS VIRICAS
-
- *c^ Y como lo prometido es deuda, aquí
- tenemos la segunda entrega de nuestro curso
- de técnicas víricas, en el cual vamos a
- aprender... (redoble)... CHAAAAAAN!
- ¡Tecnicas stealth!
-
- En efecto. Un virus que se precie las
- lleva, además porque no es especialmente
- difícil ni largo, y más después de verlo en
- el virus *cABURGLAR*c^ (que encontrarás en PhyMosys
- Magazine 2).
-
- Bueno, y vamos a empezar (siempre me
- enrollo en el principio, no tengo remedio).
-
- Ante todo, sabrás lo que es la
- interrupción 21h (y si no, no sé qué estás
- mirando en esta sección) y sus funciones.
- Pues bien, las funciones que nos interesan
- son las funciones 11h, 12h, 4Eh y 4Fh. El
- comando DIR del DOS utiliza las funciones 11h
- y 12h, y los otros programas en general (por
- mayor sencillez, manejabilidad y progreso)
- utilizan las otras. Estas funciones son:
- *cH
- 11h ->*cO Búsqueda de la primera entrada del
- directorio (por FCBs)
- *cH12h -> *cOBúsqueda de la siguiente entrada del
- directorio (por FCBs)
- *cH4Eh ->*cO Búsqueda de la primera entrada del
- directorio (por Handles)
- *cH4Fh ->*cO Búsqueda de la siguiente entrada del
- directorio (por Handles)
- *c^
- Las más importantes para un stealth
- mínimo son las dos primeras.
-
- Para una velocidad buena en el efecto
- del DIR, hay que hacer un pequeño truco en la
- fecha (no es rentable abrir el archivo cada
- vez para comprobar si está infectado, más que
- nada por la velocidad), y ésta es: o bien
- poner los segundos en el archivo a 60 o 62 en
- la hora, o bien sumarle 100 años al año en la
- fecha. El problema que tiene esto es que
- muchos anti-virus heurísticos comprueban la
- fecha y entonces esto es sospechoso. Se cogen
- estos valores porque, al hacer DIR, no se ven
- los segundos y sólo se ven las dos últimas
- cifras del año del archivo. Pero güeno,
- podremos vivir con esto.
-
- Y como decía, habrá que poner una de
- estas dos marcas. Yo personalmente prefiero
- la de los segundos, que es menos liosa y más
- rápida. Lo primero que tendremos que hacer es
- comprobar si se está llamando a las funciones
- 11h o 12h, desde el virus. Entonces se llama
- a la interrupción para que nos devuelva los
- valores del directorio. Nos devolverá en el
- DTA (cuya dirección habremos obtenido previa-
- mente mediante la función 2Fh del DOS) una
- estructura FCB (File Control Block) así:
-
- En ES:BX tenemos la dirección del DTA.
- *cH
- ES:BX+00h -->*cO Número de dispositivo
- (la unidad)
- *cHES:BX+01h -->*cO Nombre del archivo
- (rellenado con espacios)
- *cHES:BX+09h --> *cOEstensión del archivo (también
- rellenado con espacios)
- *cHES:BX+0Ch --> *cONúmero de bloque actual (sin
- interés para nosotros)
- *cHES:BX+0Eh --> *cOTamaño del bloque (idem)
- *cHES:BX+10h --> *cOTamaño de archivo en double
- word (esto es!)
- *cHES:BX+14h -->*cO Fecha de la última modificación
- (también esto)
- *cHES:BX+16h --> *cOHora de la última modificación
- (y esto también)
- *cH...*c^
-
- A esto le siguen más cosas que no nos
- interesan para lo que pensamos hacer.
-
- Y un FCB ampliado (que es usado en versiones
- posteriores de DOS) es prácticamente lo mismo,
- nada mas que hay 7 bytes más de datos al
- principio, por lo que las direcciones que nos
- interesan se obtendrán sumándole 7 a la direc-
- ción de DTA obtenida. Se sabe que es ampliado
- por el primer byte, o el byte del número de
- dispositivo, que en vez de tener el número de
- dispositivo tiene el valor FFh.
-
- Pues esto es. La fecha y la hora se
- encuentran en formato empaquetado tal y como
- os lo enseño ahí abajo. Cada x es un bit:
- *cR
- Fecha: x x x x x x x x x x x x x x x x word
- | | | | | |
- |-----------| |-----| |-------|
- año (0=1980) mes día
-
-
- Hora: x x x x x x x x x x x x x x x x word
- | | | | | |
- |-------| |---------| |-------|
- hora minuto segundo
- (en pasos
- de 2 seg.)
- *c^
- Recordad que los bits se empiezan a
- contar desde el 0 y hacia la izquierda (que
- más de uno se equivocará en esto).
-
- Más o menos ya habréis visto lo que
- hay que hacer, ¿no? ¿NO? Pues ale, voy a
- estirarme y os haré un código ejemplo.
- El que sigue.
-
- *cH
- Funcion11o12: NOP
- *cK ; Aquí se salta después de comprobar que es
- ; una función 11h o 12h (el NOP está para po-
- ; ner el comentario este, ¿eh?)
- *cH INT 21h
- *cK ; Ejecutamos la interrupción.Ahora en el DTA
- ; tenemos el resultado.
- *cH CMP AL, 0FFh
- *cK ; AL es FFh si hay error o se ha acabado el
- ; directorio.
- *cH JE Acaba
- *cK ; Acabamos si hay error
- *cH PUSH AX
- *cK ; Guardamos los registros afectados
- *cH PUSH BX
- PUSH ES
- MOV AH, 2Fh
- *cK ; Obtenemos en ES:BX la dirección del DTA
- *cH INT 21h
- CMP BYTE PTR ES:[BX],0FFh
- *cK ; Comprobamos si es un FCB ampliado.
- *cH JNE FCBNormal
- *cK ; Si no lo es, evitamos sumarle 7, y si lo
- *cH ADD BX, 0007
- *cK ; es, se lo sumamos.
- *cHCBNormal: MOV AL, ES:[BX+17h]
- *cK ; Obtenemos la parte donde están los
- ; segundos (prefiero los segundos :)
- *cH AND AL, 1Eh
- *cK ; Obtenemos sólo los segundos en AL (60 o
- ; 62. Si sólo hubieramos querido mirar 62
- ; segundos, hubiéramos hecho AND AL,1Fh).
- *cH CMP AL, 1Eh
- *cK ; ¿Es 60 segundos el resultado?
- *cH JNZ NoestaInfectao
- *cK ; Si no lo es, es que el archivo no
- ; está infectado.
- *cH SUB WORD PTR ES:[BX+1Dh], LongVirus
- *cK ; Esta claro, ¿no?
- *cH SBB WORD PTR ES:[BX+1Fh], 00
- *cK ; No olvidemos que el tamaño está en dword
- ; y hay que contar con el rebosamiento
- *cH AND BYTE PTR ES:[BX+17h], 0EFh
- *cK ; Eliminamos el bit alto de los segundos
- ; para mostrar una hora más razonable.
- *cHNoestaInfectao: POP ES
- *cK ; Recuperamos registros
- *cH POP BX
- POP AX
- Acaba: IRET
- *c^
-
- Y ya está! Pues no es tan complicado,
- oyes. Ahora vamos con las funciones 4Eh y 4Fh.
-
- Es prácticamente lo mismo, nada más
- que los datos en el DTA los devuelve de la
- manera siguiente:
- *cH
- ES:BX+00h --> *cO20 bytes de datos reservados
- *cHES:BX+14h -->*cO Atributo del archivo (si es
- oculto, de sistema, etc.)
- *cHES:BX+15h -->*cO Hora de la última modificación
- (en formato empaquetado)
- *cHES:BX+17h -->*cO Fecha de la última modificación
- (también en este formato)
- *cHES:BX+19h -->*cO Tamaño del archivo en double
- word
- *cHES:BX+1Dh -->*cO Nombre del archivo y extensión
- como cadena ASCII
- *c^
- Y ahora se hace lo mismo. Es exacta-
- mente igual, nada más que hay que tener en
- cuenta que la función devuelve Carry Flag
- cuando hay error, en vez de poner el valor
- FFh en AL tal y como hacían las funciones
- 11h y 12h. Entonces, al llamar a la función
- para que devuelva datos, habrá que guardar
- las banderas mediante un PUSHF, hacer POPF
- antes de retornar, y retornar mediante un
- RETF 0002 en vez de con IRET.
-
- Bueno, y nada más por este número
- (que de todas formas ya es bastante, creo
- yo). Para el siguiente veremos técnicas
- anti-heurísticas, que hacen que un virus
- tenga más oportunidades de pasar un
- escáner heurístico.
-
- *cG Líyak el Oscuro
-